package com.aaron.utils.concurrent.threadpool;

import lombok.Getter;
import lombok.Setter;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * 线程池自定义配置类，可自行根据业务场景修改配置参数。
 */
@Setter
@Getter
public class CustomThreadPoolConfig {
    /**
     * 线程池的几个重要概念：这些都是final修饰，不可更改的
     * 1.corePoolSize 指定了线程池中的核心线程的个数，核心线程就是永远不会被销毁的线程，一旦被创建出来就将永远存活在线程池之中。
     * 2.maximumPoolSize 指定了线程池能够创建的最大线程数量。
     * 3.keepAliveTime 是用于控制非核心线程最长空闲等待时间，如果一个非核心线程处理完任务后回到线程池待命，超过这个指定时长依然没有新任务的分配将导致线程被销毁。
     * 4.TimeUnit是java.util.concurrent包下面的一个类，表示给定单元粒度的时间段.这里是分钟
     * 5.DEFAULT_BLOCKING_QUEUE_CAPACITY
     * 6.BLOCKING_QUEUE_CAPACITY，阻塞队列的长度是100个线程。核心线程池满了之后加入到阻塞队列中，阻塞队列满才到最大线程池中
     */
    private static final int DEFAULT_CORE_POOL_SIZE = 10;
    private static final int DEFAULT_MAXIMUM_POOL_SIZE_SIZE = 100;
    private static final int DEFAULT_KEEP_ALIVE_TIME = 1;
    private static final TimeUnit DEFAULT_TIME_UNIT = TimeUnit.MINUTES;
    private static final int DEFAULT_BLOCKING_QUEUE_CAPACITY = 100;
    private static final int BLOCKING_QUEUE_CAPACITY = 100;

    /**
     * 可配置参数：
     */
    private int corePoolSize = DEFAULT_CORE_POOL_SIZE;
    private int maximumPoolSize = DEFAULT_MAXIMUM_POOL_SIZE_SIZE;
    private long keepAliveTime = DEFAULT_KEEP_ALIVE_TIME;
    private TimeUnit unit = DEFAULT_TIME_UNIT;
    private BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(BLOCKING_QUEUE_CAPACITY);
}
